/**
 * ZHU framework. Copyright 2012-, all rights reserved.
 *
 * $Id: EntityId.java 23 2012-08-17 06:37:31Z zhuxiaopeng $
 * $Revision: 23 $
 * $Date: 2012-08-17 14:37:31 +0800 (五, 2012-08-17) $
 * $Author: zhuxiaopeng $
 */
package zhu.framework.entity;

import java.io.*;

/**
 * <p>
 * </p>
 * 
 * @author $Author: zhuxiaopeng $
 * @version $Revision: 23 $ - $Date: 2012-08-17 14:37:31 +0800 (五, 2012-08-17) $
 */
public final class EntityId implements Serializable {

	/**
	 * <h3>スレッドセーフ性</h3>
	 * <p>
	 * この変数は<code>this</code>によってGuardされる。 この変数は<code>final</code>
	 * であり、参照先がスレッドセーフであるため、スレッドセーフ性を破ることはない。
	 * この変数の参照先はスレッドセーフ<strong>ではない</strong>。
	 * </p>
	 */
	private static final long serialVersionUID = 1L;

	private EntityId(final long idValue) {
		this.idValue = idValue;
	}

	private static class EntityIdCache {
		private EntityIdCache() {
		}

		final static EntityId[] cache = new EntityId[127];

		static {
			for (int i = 0; i < cache.length; i++) {
				cache[i] = new EntityId(i + 1);
			}
		}
	}

	public static EntityId valueOf(final Long idValue) {
		if (idValue == null) {
			return null;
		}
		if (0 < idValue && idValue <= 127) {
			return EntityIdCache.cache[idValue.intValue() - 1];
		}
		return new EntityId(idValue);
	}

	public long toLong() {
		return getIdValue();
	}

	public Object getId() {
		return Long.valueOf(getIdValue());
	}

	@Override
	public boolean equals(final Object obj) {
		if (obj == null) {
			return false;
		}
		if (obj instanceof EntityId == false) {
			return false;
		}

		return getIdValue() == ((EntityId) obj).getIdValue();
	}

	@Override
	public int hashCode() {
		return Long.valueOf(getIdValue()).hashCode();
	}

	@Override
	public String toString() {
		return String.valueOf(idValue);
	}

	private long getIdValue() {
		return idValue;
	}

	private final long idValue;
}
